<?php

namespace App\Http\Controllers\Admin\User;

use App\Http\Controllers\Controller;
use App\Models\User;
use App\Traits\Controllers\AdminTraits;
use App\Transformers\User\UserTransformer;
use Illuminate\Http\Request;
use Illuminate\Validation\Rule;

class UserController extends Controller
{
    //使用增删改查的方法
    use AdminTraits;

    //使用了用户的模型
    public $model = User::class;
    //使用了用户的 Transformer 来返回用户的格式
    public $transformer = UserTransformer::class;

    // 参数验证规则
    public function rules(Request $request): array
    {
        switch ($request->method()) {
            case 'GET':
                return [];
                break;
            case 'POST':  //添加用户时的表单验证
                return [
                    'phone' => ['required', 'regex:/^1[3-9]\d{9}$/', 'unique:users',],
                    'real_name' => 'max:16',
                    'password' => 'min:6|max:16|confirmed',
                    'card_id' => 'min:18|max:18'
                ];
                break;
            case 'PATCH':
            case 'PUT':  //修改用户信息时的表单验证
                return [      //Rule::unique 使用进行区分当前             检查该字段在用户表中是否是唯一的存在
                    'phone' => ['required', 'regex:/^1[3-9]\d{9}$/', Rule::unique('users', 'phone')
                        // ignore() 方法去除当前的id字段
                        ->ignore(route_parameter('user'), 'id')],
                    'real_name' => 'max:16',
                    'password' => 'min:6|max:16|confirmed',
                    'card_id' => 'min:18|max:18'
                ];
                break;
        }
        return [];
    }

    // 返回的错误的验证信息
    public function ruleMessages(): array
    {
        return [
            'phone.required' => '手机号不能为空',
            'phone.regex' => '手机号格式不正确',
            'phone.unique' => '该手机号已经注册',
            'real_name.max' => '真实姓名最大16个字符',
            'password.min' => '密码最小6个字符',
            'password.max' => '密码最大16个字符',
            'password.confirmed' => '两次输入的密码不一致',
            'card_id.max' => '身份证号码最大18位',
            'card_id.min' => '身份证号码最小18位',
        ];
    }

    //显示用户列表
    public function index(Request $request)
    {
        //先处理传过来的搜索数据
        $this->formatIndexQuery($request);

        $data = $this
            ->getQuery()
            ->pimp()//自动转换where条件
            ->with('catrgory:id,nickname')  //查询用户分组的名称
            ->paginate($this->getPageLimit());
        return $this->response->paginator($data, resolve($this->transformer));
    }


    //添加用户的方法 （添加用户的时候需要将用户密码进行哈希加密）
    public function store(Request $request)
    {
        //进行表单验证
        $this->validateData($request);
        // 添加当前等登录的管理员的id
        $request->offsetSet('system_admin_id', $this->admin_user('id'));
        //使用模型进行添加表单中所传来的信息
        $model = $this->getQuery()->fill($request->all());
        //将获取到的密码进行加密的操作
        $model->password = bcrypt($request->input('password'));
        //执行添加的操作
        $model->save();
        //获取到传来的选中的标签的id
        $label = $request->label_id;
        //使用 attach() 方法去添加标签的数组格式
        $model->userLabel()->attach($label);
        //返回执行添加后的信息
        return $this->response->created();
    }

    //修改用户信息的方法 （修改用户的时候需要将用户密码进行哈希加密）
    public function update($id, Request $request)
    {
        //验证用户要修改的信息
        $this->validateData($request);
        //获取到要修改的用户的信息
        $data = $this->getQuery()->findOrFail($id);
        //验证权限的位置
        if ($this->policy) {
            $this->authorize('update', $data);
        }
        //获取到当前要修改的用户的信息 使用 fill 的方法将经过表单验证的信息进行修改
        $data->fill($request->all());
        //将表单中的密码进行加密处理
        $data->password = bcrypt($request->input('password'));
        //查询修改用户所关联的所有的标签
        $this->getQuery()->find($id)->userLabel()->sync($request->label_id);
        //执行添加的功能
        $data->save();
        //返回添加修改后的结果
        return $this->response->noContent();
    }

    //批量设置用户的分组
    public function usergroup(Request $request)
    {
        $group_id = $request->input('group_id');//获取分组的id
        $user_id = $request->input('uid'); //获取要设置的用户的id
        //在当前的模型中  在传来的用户的字段中进行修改用户分组的id字段
        $this->getQuery()->whereIn('id', $user_id)->update(['group_id' => $group_id]);
        //返回修改后的相应结果
        return $this->response->noContent();
    }

    //批量设置用户的标签
    public function userlabel(Request $request)
    {
        $user_ids = $request->input('uid');  //接受传来的用户的id
        $label_ids = $request->input('label_id');  //接受传来的用户的id

        foreach ($user_ids as $user_id) {
            $this->getQuery()->find($user_id)->userLabel()->sync($label_ids);
        }
        return $this->response->noContent();
//         $a = $this->getQuery()->whereIn('id',$user_ids)->userLabel()->toggle($label_ids);
//         dd($a);
//        dd($user_id,$label_id);
//        $this->getQuery()->userLabel()->detach('user_id',$user_id);
//        $user = $this->getQuery()->first();
//        dd($user->userLabel);
//        foreach ($user->userLabel as $item) {
//            dd(1);
//            dd($item->pivot);
//        }
//        UserLabelRelation::query()->whereIn('user_id',$user_ids)
//            ->update(['label_id'=>$label_ids]);
//        $user = $this->getQuery()->userLabel()->whereIn('user_id',$user_id)->get();
//        dd($user);
//        $this->getQuery()->userLabel()->updateExistingPivot(['user_id',$user_id],['label_id',$label_id]);
//        $user->userLabel()->attach($label_id);
//        dd($this->getQuery()->userLabel()->sync('user_id',$user_id)->get());
//        ->updateOrCreate(['user_id'=>$user_id],['label_id'=>$label_id]);
    }

}
